﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GEAR_Structure.UNI.Energy
{
    public static class DM26Giu2009
    {

        //calcola il valore numerico dell'EPglobale prendendo in ingresso 
        //i diversi valori degli EP e il fattore di conversione Fpe=0.187*10^-3 (TEP/kWh_elettrici)
        // il valore 11.86*10^3 è ricavato dalla UNI TS 11300-2 (kWh_energiaprimaria/kWhelettrici)
        /// <summary>
        /// calcola il valore numerico dell'EPglobale prendendo in ingresso i diversi valori degli EP e il fattore di conversione Fpe=0.187*10^-3 (TEP/kWh_elettrici)
        /// </summary>
        /// <param name="EPiinv">Inserire EP involucro "EPiinv" </param>
        /// <param name="EPacs">Inserire EP acqua calda sanitaria "EPacs"</param>
        /// <param name="Fpe">Inserire Il fattore di conversione ottenuto da Fpe=0.187*10^-3 (TEP/kWh_elettrici)il valore 11.86*10^3 è ricavato dalla UNI TS 11300-2</param>
        /// <returns>Restituisce EP globale di edifici non dotati d'impianto</returns>
        public static double EPgl(double EPiinv, double EPacs, double Fpe)
        {
            double EPi = EPiinv * Fpe * 11.86;
            double EPglo = 0;
            EPglo = EPi + EPacs;
            return EPglo;

        }
        /// <summary>
        /// Calcola EPglobale
        /// </summary>
        /// <param name="EPi">EPi Fabisogno di energia per riscaldamento invernale</param>
        /// <param name="EPacs">EPacs Fabisogno di energia per acqua calda</param>
        /// <returns>restituisce il valore EPgl</returns>
        public static double EPgl(double EPi, double EPacs)
        {
            double EPglo = 0;
            EPglo = EPi + EPacs;
            return EPglo;

        }

        /// <summary>
        /// calcola EPi
        /// </summary>
        /// <param name="EPiinv">EPiinv</param>
        /// <param name="eta">Rendimento medio globale stagionale "ng"</param>
        /// <returns>EPi</returns>
        public static double EPi(double EPiinv, double eta)
        {

            double EPi = EPiinv / eta;
            return EPi;

        }
        /// <summary>
        /// calcola il valore numerico dell'EPi prendendo in ingresso il valore EPi_inv e il fattore di conversione Fpe=0.187*10^-3 (TEP/kWh_elettrici)
        /// </summary>
        /// <param name="EPiinv">Inserire EP involucro "EPiinv"</param>
        /// <param name="Fpe">Inserire Il fattore di conversione ottenuto da Fpe=0.187*10^-3 (TEP/kWh_elettrici)il valore 11.86*10^3 è ricavato dalla UNI TS 11300-2</param>
        /// <returns>Restituisce EPi di edifici non dotati d'impianto</returns>
        public static double EPi_si(double EPiinv, double Fpe)
        {
            double EPi = EPiinv * Fpe * 11.86;
            return EPi;
        }


        /// <summary>
        /// Dato un valore di EPglobale restituisce la classe energetica richiede in ingresso EPi_limite al 2010 del fabbricato e EPglobale
        /// </summary>
        /// <param name="EPi_lim">EPi_lim limite di legge</param>
        /// <param name="EPgl">EP globale</param>
        /// <returns>Classe energetica globale di appartenenza</returns>
        public static string ClasseEnergetica(double EPi_lim, double EPgl)
        {
            string cl = "NC";

            if (EPgl > (2.5 * EPi_lim + 30))
            {
                cl = "G";
            }
            if (EPgl < (2.5 * EPi_lim + 30))
            {
                cl = "F";
            }
            if (EPgl < (1.75 * EPi_lim + 24))
            {
                cl = "E";
            }
            if (EPgl < (1.25 * EPi_lim + 21))
            {
                cl = "D";
            }
            if (EPgl < (1.0 * EPi_lim + 18))
            {
                cl = "C";
            }
            if (EPgl < (0.75 * EPi_lim + 12))
            {
                cl = "B";
            }
            if (EPgl < (0.5 * EPi_lim + 9))
            {
                cl = "A";
            }
            if (EPgl < (0.25 * EPi_lim + 9))
            {
                cl = "A+";
            }

            return cl;
        }
        /// <summary>
        /// Dato un valore di EPi restituisce la classe energetica richiede in ingresso EPi_limite al 2010 del fabbricato e EPi
        /// </summary>
        /// <param name="EPi_lim"></param>
        /// <param name="EPi"></param>
        /// <returns>Classe Climatizzazione Invernale</returns>
        public static string ClasseEnergeticaEPi(double EPi_lim, double EPi)
        {
            string cl = "NC";

            if (EPi > (2.5 * EPi_lim))
            {
                cl = "G";
            }
            if (EPi < (2.5 * EPi_lim + 30))
            {
                cl = "F";
            }
            if (EPi < (1.75 * EPi_lim + 24))
            {
                cl = "E";
            }
            if (EPi < (1.25 * EPi_lim + 21))
            {
                cl = "D";
            }
            if (EPi < (1.0 * EPi_lim + 18))
            {
                cl = "C";
            }
            if (EPi < (0.75 * EPi_lim + 12))
            {
                cl = "B";
            }
            if (EPi < (0.5 * EPi_lim + 9))
            {
                cl = "A";
            }
            if (EPi < (0.25 * EPi_lim + 9))
            {
                cl = "A+";
            }

            return cl;


        }
        /// <summary>
        /// Dato un valore di EPacs restituisce la classe energetica richiede per acqua calda sanitaria del fabbricato
        /// </summary>
        /// <param name="EPacs"></param>
        /// <returns>Classe ACS</returns>
        public static string ClasseEnergeticaEPacs(double EPacs)
        {
            string cl = "NC";

            if (EPacs > (2.5))
            {
                cl = "G";
            }
            if (EPacs < (2.5))
            {
                cl = "F";
            }
            if (EPacs < (1.75))
            {
                cl = "E";
            }
            if (EPacs < (1.25))
            {
                cl = "D";
            }
            if (EPacs < (1.0))
            {
                cl = "C";
            }
            if (EPacs < (0.75))
            {
                cl = "B";
            }
            if (EPacs < (0.5))
            {
                cl = "A";
            }
            if (EPacs < (0.25))
            {
                cl = "A+";
            }

            return cl;


        }
        /// <summary>
        /// restituisce la massa superficiale prevista dal D.lgs 192/2005
        /// </summary>
        /// <param name="s"> Stratigrafia</param>
        /// <returns>Ms [kg/m²}</returns>
        public static double SurfaceMass(Stratigraphy s)
        {
            double ret = 0;
            foreach (Materiale m in s.Layers)
            {
                ret += m.Tickness * m.Density;
            }        
            double sub=0;

            if (s.Layers.Count >0)
            {
            if(s.Layers[0].Typology==Materiale.typology_material.plaster)
                sub+=s.Layers[0].Tickness*s.Layers[0].Density;
            if(s.Layers[s.Layers.Count-1].Typology==Materiale.typology_material.plaster)
                sub+=s.Layers[s.Layers.Count-1].Tickness*s.Layers[s.Layers.Count-1].Density;
            
            }
            ret -= sub;

            return ret;


        }

        /// <summary>
        /// restituisce la massa Frontale
        /// </summary>
        /// <param name="s"> Stratigrafia</param>
        /// <returns>Ms [kg/m²}</returns>
        public static double FrontalMass(Stratigraphy s)
        {
            double ret = 0;
            foreach (Materiale m in s.Layers)
            {
                ret += m.Tickness * m.Density;
            }
            return ret;
        }

    }
}
